package marca;

import java.sql.SQLException;
import java.util.ArrayList;

import marca.marcaExceptions.MarcaJaCadastradaException;
import marca.marcaExceptions.MarcaNaoCadastradaException;
import marca.marcaExceptions.MarcaNaoInformadaException;
import marca.marcaExceptions.MarcaNomeNaoInformadaException;
import marca.marcaExceptions.MarcaTemVeiculosCadastradosException;
import marca.marcaExceptions.MarcaTipoNaoInformadoException;
import tipo.CadastroTipo;
import tipo.tipoExceptions.TipoNaoCadastradoException;
import tipo.tipoExceptions.TipoNaoInformadoException;
import veiculo.CadastroVeiculo;
import veiculo.exceptions.VeiculoMarcaNaoInformadaException;


public class CadastroMarca {
	private IMarca repMarcas;
	
	public CadastroMarca(){
		if(this.repMarcas == null){
			repMarcas = new RepositorioMarcaBanco();
		}
	}
	
	public void adicionar(Marca marca) throws MarcaNomeNaoInformadaException,
	MarcaTipoNaoInformadoException, MarcaJaCadastradaException, TipoNaoInformadoException, TipoNaoCadastradoException, ClassNotFoundException, SQLException{
		
		CadastroTipo cadTipo = new CadastroTipo();
		if((marca.getNome() == null) || (marca.getNome().trim().isEmpty())){
			throw new MarcaNomeNaoInformadaException();
		}else if(existe(marca.getId()) == 1){
			throw new MarcaJaCadastradaException();
		}else if(marca.getTipo().getId() < 0){
			throw new MarcaTipoNaoInformadoException();
		}else{
			this.repMarcas.adicionar(marca);
		}
	}
	
	public void editar(Marca marca) throws MarcaNaoInformadaException, MarcaNomeNaoInformadaException,
	MarcaTipoNaoInformadoException, MarcaNaoCadastradaException, TipoNaoInformadoException, TipoNaoCadastradoException, ClassNotFoundException, SQLException{
		
		CadastroTipo cadTipo = new CadastroTipo();
		if(marca.getId() < 0){
			throw new MarcaNaoInformadaException();
		}else if(existe(marca.getId()) == 0){
			throw new MarcaNaoCadastradaException();
		}else if((marca.getNome() == null) || (marca.getNome().trim().isEmpty())){
			throw new MarcaNomeNaoInformadaException();
		}else if(marca.getTipo().getId() < 0){
			throw new MarcaTipoNaoInformadoException();
		}else{
			this.repMarcas.editar(marca);
		}
	}
	
	public void remover(int idMarca) throws MarcaNaoInformadaException, MarcaNaoCadastradaException, 
	VeiculoMarcaNaoInformadaException, MarcaTemVeiculosCadastradosException, TipoNaoInformadoException, TipoNaoCadastradoException, ClassNotFoundException, SQLException{
		
		CadastroVeiculo cadVeic = new CadastroVeiculo();
		if(idMarca < 0){
			throw new MarcaNaoInformadaException();
		}else if(existe(idMarca) == 0){
			throw new MarcaNaoCadastradaException();
		}else if(cadVeic.listar(idMarca).size() > 0){
			throw new MarcaTemVeiculosCadastradosException();
		}
		this.repMarcas.remover(idMarca);
	}
	
	public Marca pesquisar(int idMarca) throws MarcaNaoCadastradaException, MarcaNaoInformadaException,
	TipoNaoInformadoException, TipoNaoCadastradoException, ClassNotFoundException, SQLException{
		Marca marca = null;
		if(idMarca < 0){
			throw new MarcaNaoInformadaException();
		}else{
			marca = this.repMarcas.pesquisar(idMarca);
			if(marca == null){
				throw new MarcaNaoCadastradaException();
			}else{
				CadastroTipo cadTipo = new CadastroTipo();
				marca.setTipo(cadTipo.pesquisar(marca.getTipo().getId()));
			}
		}
		return marca;
	}
	public int existe(int idMarca) throws ClassNotFoundException, SQLException{
		return this.repMarcas.existe(idMarca);
	}
	
	public ArrayList<Marca> listar() throws TipoNaoInformadoException, TipoNaoCadastradoException, ClassNotFoundException, SQLException {
		ArrayList<Marca> marcas = this.repMarcas.listar();
		for(int i = 0; i < marcas.size();i++){
			CadastroTipo cadTipo = new CadastroTipo();
			marcas.get(i).setTipo(cadTipo.pesquisar(marcas.get(i).getTipo().getId()));
		}
		return marcas;
	}
	
	
	public ArrayList<Marca> listar(int idTipo) throws MarcaTipoNaoInformadoException, TipoNaoInformadoException,
	TipoNaoCadastradoException, ClassNotFoundException, SQLException{
		
		if((idTipo < 1)){
			throw new MarcaTipoNaoInformadoException();
		}else{
			ArrayList<Marca> marcas = this.repMarcas.listar(idTipo);
			for(int i = 0; i < marcas.size();i++){
				CadastroTipo cadTipo = new CadastroTipo();
				marcas.get(i).setTipo(cadTipo.pesquisar(marcas.get(i).getTipo().getId()));
			}
			return marcas;
		}
	}
	
	public ArrayList<Marca> listar(String nome) throws MarcaNomeNaoInformadaException, TipoNaoInformadoException,
	TipoNaoCadastradoException, ClassNotFoundException, SQLException{
		if(nome.trim().isEmpty()){
			throw new MarcaNomeNaoInformadaException();
		}else{
			ArrayList<Marca> marcas = this.repMarcas.listar(nome);
			for(int i = 0; i < marcas.size();i++){
				CadastroTipo cadTipo = new CadastroTipo();
				marcas.get(i).setTipo(cadTipo.pesquisar(marcas.get(i).getTipo().getId()));
			}
			return marcas;
		}
	}
	
}
